home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 526-550 / disk_539 / pf / source / umain.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  3KB  |  135 lines

  1. /* _main.c Copyright (C) 1985  Lattice, Inc. */
  2.  
  3. /**
  4.  | The code that opens a window associated with the input/output
  5.  | streams when the program is called from the Workbench has been
  6.  | deleted. Obviously writing something to stdout/stderr means
  7.  | to call for the guru...
  8. **/
  9.  
  10. #include <stdio.h>
  11. #include <fcntl.h>
  12. #include <ios1.h>
  13. #include <string.h>
  14. #include <stdlib.h>
  15. #include <workbench/startup.h>
  16. #include <libraries/dos.h>
  17. #include <libraries/dosextens.h>
  18. #include <proto/dos.h>
  19. #include <proto/exec.h>
  20.  
  21. #define MAXARG 32
  22. #define QUOTE  '"'
  23. #define ESCAPE '*'
  24. #define ESC    '\027'
  25. #define NL     '\n'
  26.  
  27. #define isspace(c) ((c == ' ')||(c == '\t') || (c == '\n'))
  28.  
  29. extern int _fmode,_iomode;
  30.  
  31. extern struct UFB _ufbs[];
  32. static int argc;                        /* arg count */
  33. static char **targv, *argv[MAXARG];     /* arg pointers */
  34. static void badarg(char *program);
  35.  
  36. extern struct WBStartup *WBenchMsg;
  37.  
  38. /**
  39. *
  40. * name         _main - process command line, open files, and call "main"
  41. *
  42. * synopsis     _main(line);
  43. *              char *line;     ptr to command line that caused execution
  44. *
  45. * description   This function performs the standard pre-processing for
  46. *               the main module of a C program.  It accepts a command
  47. *               line of the form
  48. *
  49. *                       pgmname arg1 arg2 ...
  50. *
  51. *               and builds a list of pointers to each argument.  The first
  52. *               pointer is to the program name.  For some environments, the
  53. *               standard I/O files are also opened, using file names that
  54. *               were set up by the OS interface module XCMAIN.
  55. *
  56. **/
  57.  
  58. void _main(line)
  59. register char *line;
  60. {
  61.   register char **pargv;
  62.   register int x;
  63.   char *argbuf;
  64.  
  65. /*
  66. *
  67. * Build argument pointer list
  68. *
  69. */
  70.  
  71.   while (argc < MAXARG) {
  72.     while (isspace(*line))  line++;
  73.     if (*line == '\0')      break;
  74.     pargv = &argv[argc++];
  75.     if (*line == QUOTE) {
  76.       argbuf = *pargv = ++line;  /* ptr inside quoted string */
  77.       while (*line != QUOTE) {
  78.         if (*line == ESCAPE) {
  79.           line++;
  80.           switch (*line) {
  81.             case 'E':
  82.               *argbuf++ = ESC;
  83.               break;
  84.             case 'N':
  85.               *argbuf++ = NL;
  86.               break;
  87.             default:
  88.               *argbuf++ = *line;
  89.           }
  90.           line++;
  91.         } else {
  92.           *argbuf++ = *line++;
  93.         }
  94.       }
  95.       line++;
  96.       *argbuf = '\0'; /* terminate arg */
  97.     } else {
  98.       *pargv = line;
  99.       while ((*line != '\0') && (!isspace(*line))) line++;
  100.       if (*line == '\0')  break;
  101.          else *line++ = '\0';  /* terminate arg */
  102.     }
  103.   }  /* while */
  104.   targv = (argc == 0) ? (char **)WBenchMsg : (char **)&argv[0];
  105.  
  106. /*
  107. *
  108. * Open standard files
  109. *
  110. */
  111.  
  112.   if (argc == 0) {
  113.   } else {
  114.     _ufbs[0].ufbfh = Input();
  115.     _ufbs[1].ufbfh = Output();
  116.     _ufbs[2].ufbfh = Open("*", MODE_OLDFILE);
  117.     x = UFB_NC;
  118.  
  119.     _ufbs[0].ufbflg |= UFB_RA | O_RAW | x;
  120.     _ufbs[1].ufbflg |= UFB_WA | O_RAW | x;
  121.     _ufbs[2].ufbflg |= UFB_RA | UFB_WA | O_RAW;
  122.  
  123.     x = (_fmode) ? 0 : _IOXLAT;
  124.     stdin->_file = 0;
  125.     stdin->_flag = _IOREAD | x;
  126.     stdout->_file = 1;
  127.     stdout->_flag = _IOWRT | x;
  128.     stderr->_file = 2;
  129.     stderr->_flag = _IORW | x;
  130.   }
  131.  
  132.   main(argc,targv);              /* call main function */
  133.   _exit(0);
  134. }
  135.